package cn.lili.modules.order.cart.render.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
import cn.lili.modules.order.cart.entity.enums.RenderStepEnums;
import cn.lili.modules.order.cart.entity.vo.CartSkuVO;
import cn.lili.modules.order.cart.entity.vo.CartVO;
import cn.lili.modules.order.cart.render.CartRenderStep;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 订单拆单
 *
 * @author liushuai(liushuai711 @ gmail.com)
 * @version v4.0
 * @Description:
 * @since 2022/10/13 11:03
 */
@Service
@Slf4j
public class SplitOrderRender implements CartRenderStep {

    @Override
    public RenderStepEnums step() {
        return RenderStepEnums.SPLIT_ORDER;
    }

    @Override
    public void render(TradeDTO tradeDTO) {

        secondSplit(tradeDTO);
    }

    /**
     * 二次拆单
     * 商品类型拆单、供应商拆单等
     *
     * @param tradeDTO 交易原型
     */
    private void secondSplit(TradeDTO tradeDTO) {

        //购物车拆分结果收集
        List<CartVO> cartVOList = new ArrayList<>();

        //购物车拆分
        for (CartVO cartVO : tradeDTO.getCartList()) {
            // 根据供应商拆分
            Map<String, List<CartSkuVO>> groupByStatus = cartVO.getSkuList().stream().collect(Collectors.groupingBy(CartSkuVO::getSupplierId));
            List<CartSkuVO> collect = groupByStatus.entrySet().stream().flatMap(f -> f.getValue().stream()).filter(f -> f.getGoodsSku().getThirdPartyPlatformType() != null).collect(Collectors.toList());

            groupByStatus.values().stream().forEach(f -> {
                Iterator<CartSkuVO> iterator = f.iterator();
                while (iterator.hasNext()) {
                    CartSkuVO cartSkuVO = iterator.next();
                    if(cartSkuVO.getGoodsSku().getThirdPartyPlatformType() != null) {
                        iterator.remove();
                    }
                }
            });

            System.out.println("collect == " + collect);
            System.out.println("groupByStatus == " + JSONObject.toJSONString(groupByStatus));
            // 如果无供应商则不对订单拆分进行处理 直接返回
            if (groupByStatus.size() == 1 && CollectionUtil.isEmpty(collect)) {
                cartVOList.add(cartVO);
            } else {
                groupByStatus.forEach((key, value) -> {
                    CartVO newCartVO = new CartVO(value, cartVO);
                    newCartVO.setSupplierId(key);
                    cartVOList.add(newCartVO);
                });
            }

            collect.stream().forEach(f -> {
                List<CartSkuVO> cartSkuVOList = new ArrayList<>();
                cartSkuVOList.add(f);
                CartVO newCartVO = new CartVO(cartSkuVOList,cartVO);
                cartVOList.add(newCartVO);
            });
        }
        tradeDTO.setCartList(cartVOList);
        log.info("cartVOList ===== {}" , JSONObject.toJSONString(cartVOList));
    }

}
